Appearance
基础内容介绍
Elasticsearch是一个开源的高扩展的分布式全文检索引擎,它可以近乎实时的存储、检索数据;本 身扩展性很好,可以扩展到上百台服务器,处理PB级别的数据。
ES也使用Java开发并使用 Lucene 作为其核心来实 现所有索引和搜索的功能,它的目的是通过简单的RESTful API来隐藏Lucene的复杂性,从而让全文搜索变得 简单。
Elasticsearch比传统关系型数据库如下:
> Relational DB ‐> Databases ‐> Tables ‐> Rows ‐> Columns
> Elasticsearch ‐> Indices ‐> Types ‐> Documents ‐> FieldsDocker 方式安装 es
参考下这个: https://blog.csdn.net/m0_62289824/article/details/137676075
创建一个新的Docker网络
#拉取镜像
docker pull elasticsearch:8.6.0
#创建专用网络(可选)
docker network create es-net
#创建挂载点目录
mkdir -p /usr/local/es/data /usr/local/es/config /usr/local/es/plugins
chmod 777 /usr/local/es/data
chmod 777 /usr/local/es/config
chmod 777 /usr/local/es/plugins这里使用专用网络是为了:将 Elasticsearch 和相关服务(如Kibana、Logstash)放在同一网络,与外部或其他服务隔离,减少暴露风险。
本地拉取网络有点问题,选择了默认最近的
docker pull docker.io/library/elasticsearch
下面的命令部分内容改为:elasticsearch:latest创建容器
docker run -d \
--restart=always \
--name es \
--network es-net \
-p 9200:9200 \
-p 9300:9300 \
--privileged \
-v /usr/local/es/data:/usr/share/elasticsearch/data \
-v /usr/local/es/plugins:/usr/share/elasticsearch/plugins \
-e "discovery.type=single-node" \
-e "ES_JAVA_OPTS=-Xms512m -Xmx512m" \
elasticsearch:8.6.0编写elasticsearch.yml
#进入容器
docker exec -it es /bin/bash
#跳转到 config 目录
cd config
#关闭 密码安全验证
echo 'xpack.security.enabled: false' >> elasticsearch.yml
#重启 es 容器
docker restart es这里我实际使用的版本是 docker.elastic.co/elasticsearch/elasticsearch:8.1.0 ,然后不能进行追加操作,需要进入到 vi 模式,手动编辑一下,关闭密码安全验证
测试是否部署成功:访问虚拟机地址+端口号,前面配置Elasticsearch 的端口号为:9200
出现了一下报错: Caused by: com.fasterxml.jackson.core.JsonParseException: Duplicate field 'xpack.security.enabled'
touch /usr/local/es/config/elasticsearch.yml
chmod 666 /usr/local/es/config/elasticsearch.yml编辑一下文件
cluster.name: "my-es-cluster"
network.host: 0.0.0.0
xpack.security.enabled: false删除容器并启动一下
docker run -d \
--restart=always \
--name es \
--network es-net \
-p 9200:9200 \
-p 9300:9300 \
--privileged \
-v /usr/local/es/data:/usr/share/elasticsearch/data \
-v /usr/local/es/plugins:/usr/share/elasticsearch/plugins \
-v /usr/local/es/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml \
-e "discovery.type=single-node" \
-e "ES_JAVA_OPTS=-Xms512m -Xmx512m" \
elasticsearch:8.6.0基于Docker安装Kibana
注意版本,和 es 保持对应 docker pull docker.elastic.co/kibana/kibana:8.1.0, 看你实际情况
继续上面
docker pull kibana:8.6.0
#创建挂载点目录
mkdir -p /usr/local/kibana/config /usr/local/kibana/data
chmod 777 /usr/local/kibana/data
chmod 777 /usr/local/kibana/config部署容器
docker run -d \
--restart=always \
--name kibana \
--network es-net \
-p 5601:5601 \
-e ELASTICSEARCH_HOSTS=http://es:9200 \
kibana:8.6.0测试 Kibana 是否安装成功
访问虚拟机地址+端口号,前面配置Kibana 的端口号为:5601
整合 IK 分词器
先下载一下: https://github.com/infinilabs/analysis-ik/releases/tag/v8.1.0
配置参考; https://www.cnblogs.com/ccubee/p/14254101.html
新建文件夹
mkdir -p /data/elk/es/ik
#解压
unzip elasticsearch-analysis-ik-8.1.0.zip将 IK 分词器复制到 docker 内部
docker cp /data/elk/es/ik es2:/usr/share/elasticsearch/plugins/ik/docker cp复制文件到docker内部/data/elk/es/ikik分词器路径es2es容器名称/usr/share/elasticsearch/plugins/ik/docker内es插件路径
复制完毕重启es docker restart es2(容器名称或者容器id)
测试
GET _analyze
{
"analyzer": "ik_smart",
"text":"今天天气不错"
}es 整合 ELK
还没操作,有点问题,后面看一下
参考: https://www.yuque.com/macrozheng/mall-learning/yu3lh69e1gu0ppiq
文档中用的是 下载Elasticsearch7.17.3 版本,实际自己用的是 8.1.0;先继续用一下,不行的话换一个端口映射服务安装或者切换服务。
配置参考;
拉取
docker pull logstash:8.1.0
docker pull docker.elastic.co/logstash/logstash:8.1.0目录挂载
mkdir -p /home/data/logstash/config
mkdir -p /home/data/logstash/pipeline
mkdir -p /home/data/logstash/data
mkdir -p /home/data/logstash/pipeline/mappings编辑文件
vi /home/data/logstash/config/logstash.yml
http.host: "0.0.0.0"
xpack.monitoring.elasticsearch.username: "logstash"
xpack.monitoring.elasticsearch.password: "密码"
xpack.monitoring.elasticsearch.hosts: [ "http://es-ip:9200" ]vi /home/data/logstash/pipeline/logstash.conf
input {
tcp {
mode => "server"
host => "0.0.0.0" # 允许任意主机发送日志
port => 5044 # logstash暴露的端口
codec => json_lines # 数据格式
}
}
filter {
ruby {
# 将时间转成毫秒的时间戳
code => "event.set('createTime',(event.get('@timestamp').to_f.round(3)*1000).to_i)"
}
ruby {
# 设置一个自定义字段'timestamp'[这个字段可自定义],将logstash自动生成的时间戳中的值加8小时,赋给这个字段
code => "
event.set('timestamp', event.get('@timestamp').time.localtime + 8*3600)
event.set('threadName', event.get('thread_name'))
event.set('levelValue', event.get('level_value'))
event.set('loggerName', event.get('logger_name'))
event.set('callerClassName', event.get('caller_class_name'))
event.set('callerFileName', event.get('caller_file_name'))
event.set('callerLineNumber', event.get('caller_line_number'))
event.set('callerMethodName', event.get('caller_method_name'))
event.set('stackTrace', event.get('stack_trace'))
"
}
ruby {
# 将自定义时间字段中的值重新赋给@timestamp
# code => "event.set('@timestamp',event.get('timestamp'))"
}
mutate {
# 删除自定义字段
remove_field => ["timestamp","thread_name","level_value","logger_name","HOSTNAME","caller_class_name","caller_file_name","caller_line_number","caller_method_name","stack_trace"]
}
}
output {
elasticsearch {
hosts => ["http://es-ip:9200"] # ElasticSearch 的地址和端口
user => "elastic"
password => "es密码"
index => "application-logs-%{[appName]}-%{[springProfile]}-%{+YYY-MM}" # 指定索引名
# document_type => "_doc"
codec => json
# 是否使用模板创建索引,在模板中可提前定义索引的字段类型
manage_template => true
# 索引模板文件
template => "/usr/share/logstash/pipeline/mappings/application-log-mapping.json"
template_name => "application-log"
# 在logstash重启后,是否使用模板文件覆盖es中已存在的索引模板
template_overwrite => true
}
#stdout {
# codec => rubydebug
#}
file {
path => "/usr/share/logstash/pipeline/logs/%{+YYYY-MM-dd}-%{appName}-%{springProfile}.log"
}
}vi /home/data/logstash/pipeline/mappings/application-log-mapping.json
# 这里被坑了一天,7.X后的es,type 不是再是 string 而是 type="keyword" 或 type="text"
{
"index_patterns": ["application-log*"],
"order": 1,
"mappings" : {
"dynamic_templates" : [{
"message_field" : {
"match" : "message",
"match_mapping_type" : "string",
"mapping" : {
"type" : "keyword",
"index" : true
}
}
}, {
"string_fields" : {
"match" : "*",
"match_mapping_type" : "string",
"mapping" : {
"type" : "keyword",
"index" : true
}
}
}],
"properties" : {
"@timestamp": { "type": "date" },
"@version": { "type": "keyword", "index": true },
"message": {
"type": "text",
"analyzer": "ik_max_word"
}
}
}
}运行logstash
docker run -d --name logstash --net elk-network \
--privileged=true \
-p 5044:5044 \
-v /home/data/logstash/data/:/usr/share/logstash/data \
-v /home/data/logstash/config/logstash.yml:/usr/share/logstash/config/logstash.yml \
-v /home/data/logstash/pipeline/:/usr/share/logstash/pipeline \
logstash:7.17.18相关问题:
# 如果运行中,查看日志有创建动态mapping报错,那在kibana里面执行一下手动创建mapping,看下报什么错
PUT _template/application-logs
{
mapping
}参考